#ifndef ALIGNMENT_H
#define ALIGNMENT_H

#include <pcl/point_types.h>
#include <pcl/registration/correspondence_types.h>
#include <Eigen/StdVector>


using namespace std;
using namespace pcl;

class Alignment
{
public:
    EIGEN_MAKE_ALIGNED_OPERATOR_NEW
    Alignment();
    //GETTERS
    PointCloud<PointXYZ>::Ptr getInitialObjectRegistered();
    PointCloud<PointXYZ>::Ptr getObjectRegistered();
    PointCloud<PointXYZI>::Ptr getWorld_keypoints();
    CorrespondencesPtr getCorrespond();
    Eigen::Matrix4f getInitial_transformation_matrix();
    Eigen::Matrix4f getFinal_transformation_matrix();
    Eigen::Matrix4f getTransformation_matrix();
    float getInitialScore();
    float getFinalScore();

    //SETTERS
    void setInitialObjectRegistered(PointCloud<PointXYZ>::Ptr initialObjectRegisteredGiven);
    void setObjectRegistered(PointCloud<PointXYZ>::Ptr objectRegisteredGiven);
    void setWorld_keypoints(PointCloud<PointXYZI>::Ptr world_keypointsGiven);
    void setCorrespond(CorrespondencesPtr correspondGiven);
    void setInitial_transformation_matrix(Eigen::Matrix4f initial_transformation_matrixGiven);
    void setFinal_transformation_matrix(Eigen::Matrix4f final_transformation_matrixGiven);
    void setTransformation_matrix(Eigen::Matrix4f transformation_matrixGiven);
    void setInitialScore(float &initialScoreGiven);
    void setFinalScore(float &finalScoreGiven);
private:
    PointCloud<PointXYZ>::Ptr initialObjectRegistered;
    PointCloud<PointXYZ>::Ptr objectRegistered;
    PointCloud<PointXYZI>::Ptr world_keypoints;
    CorrespondencesPtr correspond;
    Eigen::Matrix4f initial_transformation_matrix;
    Eigen::Matrix4f final_transformation_matrix;
    Eigen::Matrix4f transformation_matrix;
    float initialScore;
    float finalScore;
};

#endif

